// let a: string

// let b: unknown
// b = 'dsfsdfsd'
// //类型断言
// // a=<string>b
// a = b as string
// console.log(a)
// console.log(console)
interface myAnimal {
    //接口的作用并不是为了继承，
    //其实就是对类进行一个限制，只有满足接口中定义的方法和属性，该类才有效
    //类似于抽象类，但是接口里边只有抽象方法没有普通方法
    name: string,
    age: number,
    sayage(): void,
    sex: boolean
}
abstract class Animal {
    //抽象类只能被继承，不能创建实例对象  所谓抽象就是不是专指一个具体的事物，所以实例化没有意义
    public name: string;
    private _age: number;  //private不允许在任何位置修改和访问，只能在内部修改
    // protected age: number;    //protected允许在子类修改和访问，不允许通过实例对象修改和访问

    constructor(name: string, age: number) {
        this.name = name;
        this._age = age;
        console.log(this)
    }
    // getage() {
    //     return this.age
    // }
    // setage(nage: number) {
    //     if (nage >= 20) return alert(`${nage}啊，年龄太大了`)
    //     this.age = nage
    // }

    //ts中设置set和get的方法
    get age() {
        return this._age
    }
    set age(v: number) {
        if (v > 0) this._age = v
    }
    //定义抽象方法
    //抽象方法使用 abstract 开头，没有方法体
    //抽象方法只定义在抽象类中，必须被子类重写，
    //意思就是这个方法继承的子类必须也有这个方法，如果不定义抽象方法子类就可以没有
    abstract sayage(): void
}

class Dog extends Animal {
    sex: boolean
    constructor(name: string, age: number, sex: boolean) {//这玩意就是一个构造函数
        //如果在子类中写了构造函数，在子类构造函数中必须对父类的构造函数进行调用
        super(name, age)
        this.sex = sex
    }
    bark() {
        console.log(`${this.name}在汪汪叫！`);
    }
    sayage() {
        console.log(`我${this.age}岁了！---重写方法`)
        // super.sayage()
    }
    saysex() {
        console.log(`我是个${this.sex ? '男生' : '女生'}，谢谢`,)
    }
    changeage(n: number) {
        this.age = n
    }
}
//简写方法，不用在外边声明，也不用在构造函数内部赋值，直接在形参中对属性声明关键字
// class C {
//     constructor(public name: string, public age: number) { }
// }
// const a = new C('shabi', 22)

// console.log(a.name)
class D {//static关键字 生命的属性和方法是类的静态方法，不需要通过实例化就可以通过类直接访问到
    static myname = '我是静态属性小明'
    static say() {
        console.log('我是静态方法D')
    }
}

const dog = new Dog('旺财', 4, true);
const dog1 = new Dog('小包', 3, false);
dog.bark()
dog.sayage()
dog.saysex()
dog1.bark()
dog1.sayage()
dog1.saysex()

dog1.changeage(1)
dog1.sayage()

console.log(D.myname)
D.say()